import type { IBaseEntity } from '../common/base';
import type { ScheduleInstanceStatusEnum } from './enums';

/**
 * 课程实例实体接口
 * @description 课程实例的完整信息结构
 */
export interface IScheduleInstance extends IBaseEntity {
  /** 关联课程安排模板ID */
  templateId: string;
  /** 关联学生ID */
  studentId: string;
  /** 关联课程ID */
  courseId: string;
  /** 具体日期 */
  date: string;
  /** 开始时间 */
  startTime: string;
  /** 结束时间 */
  endTime: string;
  /** 第几次课程 */
  sequenceNumber: number;
  /** 教室地点 */
  location?: string;
  /** 备注信息 */
  remark?: string;
  /** 实例状态 */
  status: ScheduleInstanceStatusEnum;
  /** 是否为补课 */
  isMakeup: boolean;
  /** 原始实例ID（补课时关联的原实例） */
  originalInstanceId?: string;
  /** 取消原因 */
  cancelReason?: string;
  /** 取消时间 */
  cancelledAt?: number;
  /** 完成时间 */
  completedAt?: number;
  /** 实际开始时间 */
  actualStartTime?: string;
  /** 实际结束时间 */
  actualEndTime?: string;
  /** 出勤状态 */
  attendanceStatus?: 'present' | 'absent' | 'late' | 'early_leave';
  /** 课程评价 */
  evaluation?: {
    /** 评分（1-5） */
    rating: number;
    /** 评价内容 */
    comment?: string;
    /** 评价时间 */
    evaluatedAt: number;
  };
  /** 作业信息 */
  homework?: {
    /** 作业内容 */
    content: string;
    /** 作业状态 */
    status: 'assigned' | 'submitted' | 'reviewed';
    /** 提交时间 */
    submittedAt?: number;
    /** 评价 */
    feedback?: string;
  };
  /** 课程费用 */
  fee?: number;
  /** 支付状态 */
  paymentStatus?: 'unpaid' | 'paid' | 'refunded';
  /** 支付时间 */
  paidAt?: number;
}

/**
 * 课程实例创建请求
 * @description 创建课程实例时需要的数据
 */
export type IScheduleInstanceCreateRequest = Omit<
  IScheduleInstance, 
  'id' | 'createdAt' | 'updatedAt' | 'cancelledAt' | 'completedAt'
>;

/**
 * 课程实例更新请求
 * @description 更新课程实例信息时的数据
 */
export type IScheduleInstanceUpdateRequest = Partial<IScheduleInstanceCreateRequest> & {
  /** 实例ID */
  id: string;
};

/**
 * 课程实例查询参数
 * @description 查询课程实例时的筛选条件
 */
export interface IScheduleInstanceQueryParams {
  /** 模板ID */
  templateId?: string;
  /** 模板ID列表 */
  templateIds?: string[];
  /** 学生ID */
  studentId?: string;
  /** 学生ID列表 */
  studentIds?: string[];
  /** 课程ID */
  courseId?: string;
  /** 课程ID列表 */
  courseIds?: string[];
  /** 日期范围 - 开始日期 */
  dateFrom?: string;
  /** 日期范围 - 结束日期 */
  dateTo?: string;
  /** 具体日期 */
  date?: string;
  /** 日期列表 */
  dates?: string[];
  /** 时间范围 - 开始时间 */
  timeFrom?: string;
  /** 时间范围 - 结束时间 */
  timeTo?: string;
  /** 实例状态 */
  status?: ScheduleInstanceStatusEnum;
  /** 实例状态列表 */
  statuses?: ScheduleInstanceStatusEnum[];
  /** 是否为补课 */
  isMakeup?: boolean;
  /** 出勤状态 */
  attendanceStatus?: 'present' | 'absent' | 'late' | 'early_leave';
  /** 支付状态 */
  paymentStatus?: 'unpaid' | 'paid' | 'refunded';
  /** 教室地点 */
  location?: string;
  /** 序号范围 - 最小序号 */
  minSequenceNumber?: number;
  /** 序号范围 - 最大序号 */
  maxSequenceNumber?: number;
}

/**
 * 课程实例统计信息
 * @description 课程实例相关的统计数据
 */
export interface IScheduleInstanceStatistics {
  /** 实例总数 */
  totalCount: number;
  /** 已安排的实例数 */
  scheduledCount: number;
  /** 已完成的实例数 */
  completedCount: number;
  /** 已取消的实例数 */
  cancelledCount: number;
  /** 补课实例数 */
  makeupCount: number;
  /** 按学生分组统计 */
  studentDistribution: Array<{
    studentId: string;
    studentName: string;
    totalInstances: number;
    completedInstances: number;
    cancelledInstances: number;
    attendanceRate: number;
  }>;
  /** 按课程分组统计 */
  courseDistribution: Array<{
    courseId: string;
    courseName: string;
    totalInstances: number;
    completedInstances: number;
    cancelledInstances: number;
  }>;
  /** 按日期分组统计 */
  dateDistribution: Array<{
    date: string;
    instanceCount: number;
  }>;
  /** 按出勤状态分组统计 */
  attendanceDistribution: Array<{
    status: 'present' | 'absent' | 'late' | 'early_leave';
    count: number;
    percentage: number;
  }>;
  /** 平均评分 */
  averageRating: number;
  /** 总收入 */
  totalRevenue: number;
  /** 已收费用 */
  paidRevenue: number;
  /** 未收费用 */
  unpaidRevenue: number;
}

/**
 * 课程实例简要信息
 * @description 用于列表显示的实例简要信息
 */
export interface IScheduleInstanceSummary {
  /** 实例ID */
  id: string;
  /** 模板ID */
  templateId: string;
  /** 学生ID */
  studentId: string;
  /** 学生姓名 */
  studentName: string;
  /** 课程ID */
  courseId: string;
  /** 课程名称 */
  courseName: string;
  /** 课程颜色 */
  courseColor: string;
  /** 授课教师 */
  teacher: string;
  /** 日期 */
  date: string;
  /** 开始时间 */
  startTime: string;
  /** 结束时间 */
  endTime: string;
  /** 序号 */
  sequenceNumber: number;
  /** 实例状态 */
  status: ScheduleInstanceStatusEnum;
  /** 是否为补课 */
  isMakeup: boolean;
  /** 教室地点 */
  location?: string;
  /** 出勤状态 */
  attendanceStatus?: 'present' | 'absent' | 'late' | 'early_leave';
}

/**
 * 课程实例详情
 * @description 包含关联数据的实例详情
 */
export interface IScheduleInstanceDetail extends IScheduleInstance {
  /** 关联的学生信息 */
  student: {
    id: string;
    name: string;
    studentId: string;
    phone?: string;
  };
  /** 关联的课程信息 */
  course: {
    id: string;
    name: string;
    courseCode: string;
    teacher: string;
    color: string;
  };
  /** 关联的模板信息 */
  template: {
    id: string;
    totalCount: number;
    completedCount: number;
    remainingCount: number;
  };
  /** 上一次课程实例 */
  previousInstance?: {
    id: string;
    date: string;
    status: ScheduleInstanceStatusEnum;
  };
  /** 下一次课程实例 */
  nextInstance?: {
    id: string;
    date: string;
    status: ScheduleInstanceStatusEnum;
  };
}

/**
 * 课程实例批量操作请求
 * @description 批量操作实例的请求参数
 */
export interface IScheduleInstanceBatchRequest {
  /** 实例ID列表 */
  instanceIds: string[];
  /** 操作类型 */
  action: 'complete' | 'cancel' | 'reschedule' | 'mark_attendance' | 'delete';
  /** 操作参数 */
  params?: {
    /** 取消原因 */
    cancelReason?: string;
    /** 新的日期（重新安排时） */
    newDate?: string;
    /** 新的时间（重新安排时） */
    newStartTime?: string;
    /** 新的时间（重新安排时） */
    newEndTime?: string;
    /** 出勤状态 */
    attendanceStatus?: 'present' | 'absent' | 'late' | 'early_leave';
    /** 备注 */
    remark?: string;
  };
}

/**
 * 课程实例批量操作响应
 * @description 批量操作实例的响应结果
 */
export interface IScheduleInstanceBatchResponse {
  /** 成功的实例ID列表 */
  success: string[];
  /** 失败的实例ID列表 */
  failed: string[];
  /** 失败详情 */
  errors?: Array<{
    instanceId: string;
    error: string;
  }>;
}

/**
 * 课程实例冲突信息
 * @description 时间冲突的实例信息
 */
export interface IScheduleInstanceConflict {
  /** 冲突的实例ID */
  instanceId: string;
  /** 冲突的学生ID */
  studentId: string;
  /** 冲突的学生姓名 */
  studentName: string;
  /** 冲突的课程ID */
  courseId: string;
  /** 冲突的课程名称 */
  courseName: string;
  /** 冲突日期 */
  date: string;
  /** 冲突时间段 */
  timeRange: string;
  /** 冲突类型 */
  conflictType: 'time_overlap' | 'same_time' | 'location_conflict';
  /** 冲突描述 */
  description: string;
}